package v1

import (
	"path/filepath"
	"time"
)

// Recorder 记录器接口
// 记录器用于记录数据的偏移量和修改时间等信息
// 记录器可以将数据存储到文件或其他持久化存储中
// 记录器需要实现 Record 方法来记录数据，IsReaded 方法来检查数据是否已被读取，Where 方法来获取存储的条目
// 记录器还需要实现 RecoderStorer 接口来进行持久化存储
type Recorder interface {
	Record(key string, entry StoreEntry) error
	IsReaded(p *FileRecordEntry) ReadState
	Where(key string) StoreEntry
	//持久化接口
	RecoderStorer
}
type StoreEntry struct {
	ModTime time.Time `json:"modTime"` //文件修改时间
	Offset  int       `json:"offset"`  //文件偏移量,如果不记录偏移量，则存储负数
}
type FileRecordEntry struct {
	Dir        string //记录日志目录
	FileName   string //记录日志文件名
	StoreEntry StoreEntry
}

func (fre FileRecordEntry) Key() string {
	return filepath.Join(fre.Dir, fre.FileName)
}
func (fre FileRecordEntry) Record(r Recorder) {
	r.Record(filepath.Join(fre.Dir, fre.FileName), fre.StoreEntry)
}

type ReadState int8

const (
	ReadStateUnReaded ReadState = iota - 1 //未读取过
	ReadStateReading                       //正在读取，未读完
	ReadStateReaded                        //已经读取过，已读完
)

type RecoderStorer interface {
	Store(key string, data []byte) error
	Take() ([]byte, error)
}
